{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Piecewise Function Approximation\n",
    "\n",
    "Sometimes we have to optimize for a slightly more complex function than just minimizing or maximizing the sum of a list of variables.\n",
    "In this case, we can use a piecewise linear or constant function approximation to simplify the problem.\n",
    "\n",
    "Imagine the following problem:\n",
    "You are given a list of items, each having a weight between 1 and 1000.\n",
    "You have to pack these items into k boxes, each with a maximum weight of 1000.\n",
    "However, in this case we are not trying to maximize the number of packed items or minimize the number of used boxes, but want to have a good distribution of weights due to some constraints (e.g., for ensuring a stable transport).\n",
    "The optimal weight of a box is 600, and deviations from this value should be minimized."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 800x400 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from piecewise_functions import PiecewiseConstantFunction, PiecewiseLinearFunction\n",
    "\n",
    "f1 = PiecewiseLinearFunction(xs=[0, 600, 1000], ys=[0, 100, 0])\n",
    "f2 = PiecewiseLinearFunction(xs=[0, 400, 600, 700, 1000], ys=[0, 20, 100, 20, 0])\n",
    "f3 = PiecewiseConstantFunction(xs=[0, 400, 550, 650, 700, 1001], ys=[0, 20, 100, 20, 0])\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "plt.figure(figsize=(8, 4))\n",
    "plt.xlabel(\"x\")\n",
    "plt.ylabel(\"f(x)\")\n",
    "x = range(0, 1001)\n",
    "# plot all functions\n",
    "for f, label in [(f1, \"f1\"), (f2, \"f2\"), (f3, \"f3\")]:\n",
    "    plt.plot(x, [f(t) for t in x], label=label)\n",
    "plt.grid()\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# create instance\n",
    "import random\n",
    "\n",
    "\n",
    "def generate_instance(k, num_items):\n",
    "    items = [random.randint(1, 50) for _ in range(num_items)]\n",
    "    return items\n",
    "\n",
    "\n",
    "k = 50\n",
    "num_items = 500\n",
    "items = generate_instance(k, num_items)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "from piecewise_functions import PiecewiseConstantConstraint, PiecewiseLinearConstraint\n",
    "from ortools.sat.python import cp_model\n",
    "\n",
    "\n",
    "def create_model(k: int, items, f):\n",
    "    model = cp_model.CpModel()\n",
    "    x = [\n",
    "        [model.new_bool_var(f\"x[{i}, {b}]\") for b in range(k)]\n",
    "        for i in range(len(items))\n",
    "    ]\n",
    "    for i in range(len(items)):\n",
    "        model.add_at_most_one(x[i])\n",
    "    # simple symmetry breaking\n",
    "    for b in range(k):\n",
    "        for b_ in range(b + 1, k):\n",
    "            model.add(x[b][b_] == 0)\n",
    "    # How filled is bin b\n",
    "\n",
    "    x_fill = [model.new_int_var(0, 1000, f\"x_fill[{i}]\") for i in range(k)]\n",
    "    # basic symmetry breaking\n",
    "    # for v, v_ in zip(x_fill[:-1], x_fill[1:]):\n",
    "    #    model.Add(v <= v_)\n",
    "    for b in range(k):\n",
    "        model.add(x_fill[b] == sum(x[i][b] * items[i] for i in range(len(items))))\n",
    "    if isinstance(f, PiecewiseConstantFunction):\n",
    "        y = [\n",
    "            PiecewiseConstantConstraint(model=model, x_var=x_fill_, f=f)\n",
    "            for x_fill_ in x_fill\n",
    "        ]\n",
    "    elif isinstance(f, PiecewiseLinearFunction):\n",
    "        y = [\n",
    "            PiecewiseLinearConstraint(model=model, x=x_fill_, f=f, upper_bound=True)\n",
    "            for x_fill_ in x_fill\n",
    "        ]\n",
    "    else:\n",
    "        raise ValueError(\"Unknown function type\")\n",
    "    # objective\n",
    "    model.maximize(sum(y.y for y in y))\n",
    "    return model, x_fill"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Starting CP-SAT solver v9.10.4067\n",
      "Parameters: max_time_in_seconds: 60 log_search_progress: true relative_gap_limit: 0.01\n",
      "Setting number of workers to 8\n",
      "\n",
      "Initial optimization model '': (model_fingerprint: 0x7d04bf2008dfbc67)\n",
      "#Variables: 25'100 (#ints: 50 in objective)\n",
      "  - 25'000 Booleans in [0,1]\n",
      "  - 50 in [0,100]\n",
      "  - 50 in [0,1000]\n",
      "#kAtMostOne: 500 (#literals: 25'000)\n",
      "#kLinear1: 1'325\n",
      "#kLinear2: 100\n",
      "#kLinearN: 50 (#terms: 25'050)\n",
      "\n",
      "Starting presolve at 0.00s\n",
      "  2.71e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  1.17e-02s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  3.79e-04s  0.00e+00d  [ExtractEncodingFromLinear] #potential_supersets=499 #potential_subsets=50 \n",
      "[Symmetry] Graph for symmetry has 49'156 nodes and 71'231 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.021137 dtime: 0.0389449\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] 2500 orbits with sizes: 18,18,18,18,18,18,18,18,18,18,...\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "[SAT presolve] num removable Booleans: 0 / 23775\n",
      "[SAT presolve] num trivial clauses: 0\n",
      "[SAT presolve] [0s] clauses:12 literals:24 vars:13 one_side_vars:13 simple_definition:0 singleton_clauses:0\n",
      "[SAT presolve] [4.5e-05s] clauses:12 literals:24 vars:13 one_side_vars:13 simple_definition:0 singleton_clauses:0\n",
      "[SAT presolve] [0.000402s] clauses:12 literals:24 vars:13 one_side_vars:13 simple_definition:0 singleton_clauses:0\n",
      "  4.91e-01s  3.39e-01d  [Probe] #probed=47'550 \n",
      "  2.49e-03s  0.00e+00d  [MaxClique] \n",
      "  2.76e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.85e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  4.98e-03s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  5.20e-04s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  2.82e-04s  7.25e-05d  [DetectDominatedLinearConstraints] #relevant_constraints=150 #num_inclusions=50 \n",
      "  9.20e-05s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.10e-03s  1.19e-04d  [ProcessSetPPC] #relevant_constraints=561 \n",
      "  6.60e-05s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  4.17e-02s  1.43e-01d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  5.47e-03s  5.71e-02d  [FindBigVerticalLinearOverlap] \n",
      "  1.21e-03s  5.96e-03d  [FindBigHorizontalLinearOverlap] #linears=50 \n",
      "  1.70e-04s  0.00e+00d  [MergeClauses] \n",
      "  2.61e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  7.50e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  2.49e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  7.19e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "[Symmetry] Graph for symmetry has 49'156 nodes and 71'231 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.020168 dtime: 0.0377083\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] 2500 orbits with sizes: 18,18,18,18,18,18,18,18,18,18,...\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "[SAT presolve] num removable Booleans: 0 / 23775\n",
      "[SAT presolve] num trivial clauses: 0\n",
      "[SAT presolve] [0s] clauses:13 literals:26 vars:15 one_side_vars:15 simple_definition:0 singleton_clauses:0\n",
      "[SAT presolve] [4.4e-05s] clauses:13 literals:26 vars:15 one_side_vars:15 simple_definition:0 singleton_clauses:0\n",
      "[SAT presolve] [0.000522s] clauses:13 literals:26 vars:15 one_side_vars:15 simple_definition:0 singleton_clauses:0\n",
      "  4.93e-01s  3.39e-01d  [Probe] #probed=47'550 \n",
      "  3.06e-03s  0.00e+00d  [MaxClique] \n",
      "  2.86e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.80e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  4.74e-03s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  5.16e-04s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  2.85e-04s  7.25e-05d  [DetectDominatedLinearConstraints] #relevant_constraints=150 #num_inclusions=50 \n",
      "  9.90e-05s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.01e-03s  1.19e-04d  [ProcessSetPPC] #relevant_constraints=561 \n",
      "  6.40e-05s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  4.20e-02s  1.43e-01d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  5.63e-03s  5.71e-02d  [FindBigVerticalLinearOverlap] \n",
      "  1.22e-03s  5.96e-03d  [FindBigHorizontalLinearOverlap] #linears=50 \n",
      "  4.10e-05s  0.00e+00d  [MergeClauses] \n",
      "  2.65e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  7.35e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  4.27e-04s  0.00e+00d  [ExpandObjective] #entries=23'775 #tight_variables=50 #tight_constraints=50 \n",
      "\n",
      "Presolve summary:\n",
      "  - 0 affine relations were detected.\n",
      "  - rule 'TODO dual: only one blocking constraint?' was applied 142'651 times.\n",
      "  - rule 'TODO dual: only one unspecified blocking constraint?' was applied 300 times.\n",
      "  - rule 'TODO symmetry: add symmetry breaking inequalities?' was applied 2 times.\n",
      "  - rule 'at_most_one: removed literals' was applied 49 times.\n",
      "  - rule 'at_most_one: size one' was applied 1 time.\n",
      "  - rule 'domination: added implications' was applied 12 times.\n",
      "  - rule 'linear: always true' was applied 100 times.\n",
      "  - rule 'linear: empty' was applied 1'225 times.\n",
      "  - rule 'linear: fixed or dup variables' was applied 1'274 times.\n",
      "  - rule 'linear: reduced variable domains' was applied 1'225 times.\n",
      "  - rule 'linear: simplified rhs' was applied 100 times.\n",
      "  - rule 'presolve: 1225 unused variables removed.' was applied 1 time.\n",
      "  - rule 'presolve: iteration' was applied 2 times.\n",
      "\n",
      "Presolved optimization model '': (model_fingerprint: 0x1f627dd51cf504b3)\n",
      "#Variables: 23'875 (#ints: 50 in objective)\n",
      "  - 23'775 Booleans in [0,1]\n",
      "  - 50 in [0,100]\n",
      "  - 50 in [0,1000]\n",
      "#kAtMostOne: 498 (#literals: 23'772)\n",
      "#kBoolAnd: 2 (#enforced: 2) (#literals: 15)\n",
      "#kLinear2: 100\n",
      "#kLinearN: 50 (#terms: 23'825)\n",
      "\n",
      "Preloading model.\n",
      "#Bound   1.26s best:-inf  next:[-0,5000]  initial_domain\n",
      "[Symmetry] Graph for symmetry has 47'931 nodes and 71'231 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.020195 dtime: 0.0376348\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "#Model   1.29s var:23875/23875 constraints:650/650\n",
      "\n",
      "Starting search at 1.29s with 8 workers.\n",
      "6 full problem subsolvers: [core, default_lp, max_lp, no_lp, quick_restart, reduced_costs]\n",
      "1 first solution subsolver: [fj_short_default]\n",
      "9 incomplete subsolvers: [feasibility_pump, graph_arc_lns, graph_cst_lns, graph_dec_lns, graph_var_lns, rins/rens, rnd_cst_lns, rnd_var_lns, violation_ls]\n",
      "3 helper subsolvers: [neighborhood_helper, synchronization_agent, update_gap_integral]\n",
      "#1       1.30s best:-0    next:[1,5000]   fj_short_default(batch:1 #lin_moves:0 #lin_evals:0 #weight_updates:0)\n",
      "#2       1.35s best:1     next:[2,5000]   violation_ls(batch:1 #solutions_imported:1 #lin_moves:0 #lin_evals:97 #gen_moves:4 #gen_evals:0 #comp_moves:4 #backtracks:0 #weight_updates:0)\n",
      "#3       1.60s best:1000  next:[1001,5000] rnd_var_lns (d=0.50 s=9 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#4       1.77s best:1100  next:[1101,5000] graph_var_lns (d=0.50 s=11 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#5       2.18s best:2038  next:[2039,5000] graph_arc_lns (d=0.50 s=12 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#6       2.75s best:2067  next:[2068,5000] graph_dec_lns (d=0.50 s=14 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#7       3.86s best:2075  next:[2076,5000] rnd_cst_lns (d=0.29 s=20 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#8       4.02s best:2078  next:[2079,5000] graph_arc_lns (d=0.29 s=22 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#9       4.24s best:2081  next:[2082,5000] graph_dec_lns (d=0.29 s=24 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#Bound   4.52s best:2081  next:[2082,3057] max_lp\n",
      "#Bound   4.89s best:2081  next:[2082,2196] max_lp\n",
      "#Bound   5.35s best:2081  next:[2082,2106] max_lp\n",
      "#10      5.56s best:2082  next:[2083,2106] rnd_var_lns (d=0.36 s=37 t=0.10 p=0.33 stall=2 h=auto_l0)\n",
      "#Bound   7.06s best:2082  next:[2083,2105] quick_restart\n",
      "#Done    7.91s quick_restart\n",
      "\n",
      "Task timing                   n [     min,      max]      avg      dev     time         n [     min,      max]      avg      dev    dtime\n",
      "              'core':         1 [   6.63s,    6.63s]    6.63s   0.00ns    6.63s         1 [   3.52s,    3.52s]    3.52s   0.00ns    3.52s\n",
      "        'default_lp':         1 [   6.63s,    6.63s]    6.63s   0.00ns    6.63s         1 [   3.54s,    3.54s]    3.54s   0.00ns    3.54s\n",
      "  'feasibility_pump':         8 [ 35.12ms, 370.15ms] 267.24ms  96.00ms    2.14s         7 [ 34.24ms,  73.13ms]  47.74ms  11.10ms 334.21ms\n",
      "  'fj_short_default':         1 [  7.59ms,   7.59ms]   7.59ms   0.00ns   7.59ms         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "     'graph_arc_lns':         7 [ 57.16ms, 415.54ms] 165.50ms 108.69ms    1.16s         7 [263.27us, 107.50ms]  72.67ms  45.80ms 508.70ms\n",
      "     'graph_cst_lns':         7 [ 19.64ms, 421.00ms] 130.04ms 137.26ms 910.26ms         4 [  1.75ms, 114.97ms]  79.22ms  45.14ms 316.89ms\n",
      "     'graph_dec_lns':         7 [ 29.52ms, 558.98ms] 206.64ms 163.60ms    1.45s         7 [ 10.00ns, 186.67ms]  89.39ms  63.46ms 625.74ms\n",
      "     'graph_var_lns':         7 [ 84.52ms, 311.45ms] 185.66ms  64.24ms    1.30s         7 [ 10.44ms, 196.05ms]  89.90ms  56.71ms 629.33ms\n",
      "            'max_lp':         1 [   6.63s,    6.63s]    6.63s   0.00ns    6.63s         1 [   2.31s,    2.31s]    2.31s   0.00ns    2.31s\n",
      "             'no_lp':         1 [   6.63s,    6.63s]    6.63s   0.00ns    6.63s         1 [735.06ms, 735.06ms] 735.06ms   0.00ns 735.06ms\n",
      "     'quick_restart':         1 [   6.62s,    6.62s]    6.62s   0.00ns    6.62s         1 [   2.83s,    2.83s]    2.83s   0.00ns    2.83s\n",
      "     'reduced_costs':         1 [   6.63s,    6.63s]    6.63s   0.00ns    6.63s         1 [   2.16s,    2.16s]    2.16s   0.00ns    2.16s\n",
      "         'rins/rens':         8 [ 39.45ms, 556.90ms] 295.84ms 188.45ms    2.37s         8 [ 10.00ns, 122.97ms]  77.89ms  45.58ms 623.14ms\n",
      "       'rnd_cst_lns':         7 [ 35.73ms, 734.38ms] 252.98ms 234.19ms    1.77s         7 [ 10.00ns, 123.68ms]  77.77ms  43.79ms 544.39ms\n",
      "       'rnd_var_lns':         7 [ 47.03ms, 430.45ms] 201.14ms 129.34ms    1.41s         7 [537.73us, 104.84ms]  64.19ms  44.66ms 449.35ms\n",
      "      'violation_ls':         8 [  9.52ms, 135.38ms]  83.09ms  52.88ms 664.71ms         8 [ 18.45us,  51.35ms]  33.21ms  23.08ms 265.66ms\n",
      "\n",
      "Search stats         Bools  Conflicts  Branches  Restarts  BoolPropag  IntegerPropag\n",
      "           'core':  23'825     13'733    86'528    47'551   7'324'080     10'156'369\n",
      "     'default_lp':  23'824          0    84'047    73'055   1'760'562      3'714'633\n",
      "         'max_lp':  23'775          0    95'430    95'083   2'288'330      4'758'408\n",
      "          'no_lp':  23'775        633   137'637    95'083   2'408'986      5'251'605\n",
      "  'quick_restart':  23'775          1   143'117   142'617   3'432'538      7'138'042\n",
      "  'reduced_costs':  23'825        477   116'419    95'084   2'342'918      4'912'670\n",
      "\n",
      "SAT stats           ClassicMinim  LitRemoved  LitLearned  LitForgotten  Subsumed  MClauses  MDecisions  MLitTrue  MSubsumed  MLitRemoved  MReused\n",
      "           'core':         9'664      57'168  18'161'891     4'160'123       377         0           0         0          0            0        0\n",
      "     'default_lp':             0           0           0             0         0         0           0         0          0            0        0\n",
      "         'max_lp':             0           0           0             0         0         0           0         0          0            0        0\n",
      "          'no_lp':           471       3'239  11'796'315             0        87         0           0         0          0            0        0\n",
      "  'quick_restart':             0           0           1             0         0         0           0         0          0            0        0\n",
      "  'reduced_costs':           261       1'921   3'238'851             0       112         0           0         0          0            0        0\n",
      "\n",
      "Lp stats            Component  Iterations  AddedCuts  OPTIMAL  DUAL_F.  DUAL_U.\n",
      "     'default_lp':          1      34'459        740      103       52        0\n",
      "         'max_lp':          1      15'300          0        0      336        0\n",
      "  'quick_restart':          1      26'140        740       19       30        0\n",
      "  'reduced_costs':          1      16'065        742       13      783      475\n",
      "\n",
      "Lp dimension                                                           Final dimension of first component\n",
      "     'default_lp':  585 rows, 23875 columns, 47047 entries with magnitude in [1.414214e-01, 1.000000e+00]\n",
      "         'max_lp':  661 rows, 23875 columns, 47823 entries with magnitude in [1.414214e-01, 1.000000e+00]\n",
      "  'quick_restart':  598 rows, 23875 columns, 47697 entries with magnitude in [1.414214e-01, 1.000000e+00]\n",
      "  'reduced_costs':  400 rows, 23875 columns, 38492 entries with magnitude in [1.414214e-01, 1.000000e+00]\n",
      "\n",
      "Lp debug            CutPropag  CutEqPropag  Adjust  Overflow  Bad  BadScaling\n",
      "     'default_lp':          0            0      70         0  431           0\n",
      "         'max_lp':          0            0     333         0    0           0\n",
      "  'quick_restart':          0            0       9         0  431           0\n",
      "  'reduced_costs':          0            0     432         0  432           0\n",
      "\n",
      "Lp pool             Constraints  Updates  Simplif  Merged  Shortened  Split  Strenghtened  Cuts/Call\n",
      "     'default_lp':        1'388        0        0       0          0      0             0  740/1'381\n",
      "         'max_lp':          661        0        0       0          0      0             0        0/0\n",
      "  'quick_restart':        1'388        0        0       0          0      0             0  740/1'381\n",
      "  'reduced_costs':        1'403        0        0       0          0      0             0  742/1'387\n",
      "\n",
      "Lp Cut       default_lp  quick_restart  reduced_costs\n",
      "     CG_FF:          77             77             77\n",
      "      CG_K:          85             85             85\n",
      "      CG_R:         124            124            124\n",
      "    CG_RBP:          11             11             11\n",
      "  MIR_2_FF:         138            138            139\n",
      "   MIR_2_K:         136            136            136\n",
      "   MIR_2_R:         139            139            140\n",
      "  MIR_3_FF:           6              6              5\n",
      "   MIR_3_K:           9              9              8\n",
      "   MIR_3_R:           6              6              5\n",
      "  MIR_5_FF:           3              3              3\n",
      "   MIR_5_K:           3              3              3\n",
      "   MIR_5_R:           3              3              3\n",
      "  MIR_6_FF:           -              -              1\n",
      "   MIR_6_K:           -              -              1\n",
      "   MIR_6_R:           -              -              1\n",
      "\n",
      "LNS stats           Improv/Calls  Closed  Difficulty  TimeLimit\n",
      "  'graph_arc_lns':           2/7     29%        0.12       0.10\n",
      "  'graph_cst_lns':           1/4     25%        0.18       0.10\n",
      "  'graph_dec_lns':           2/7     29%        0.12       0.10\n",
      "  'graph_var_lns':           1/7     29%        0.19       0.10\n",
      "      'rins/rens':           0/8     25%        0.09       0.10\n",
      "    'rnd_cst_lns':           2/7     29%        0.11       0.10\n",
      "    'rnd_var_lns':           2/7     43%        0.33       0.10\n",
      "\n",
      "LS stats               Batches  Restarts  LinMoves  GenMoves  CompoundMoves  WeightUpdates\n",
      "  'fj_short_default':        1         1         0         0              0              0\n",
      "      'violation_ls':        8         0    47'743     1'581             40          2'554\n",
      "\n",
      "Solutions (10)         Num    Rank\n",
      "  'fj_short_default':    1   [1,1]\n",
      "     'graph_arc_lns':    2   [5,8]\n",
      "     'graph_dec_lns':    2   [6,9]\n",
      "     'graph_var_lns':    1   [4,4]\n",
      "       'rnd_cst_lns':    1   [7,7]\n",
      "       'rnd_var_lns':    2  [3,10]\n",
      "      'violation_ls':    1   [2,2]\n",
      "\n",
      "Objective bounds     Num\n",
      "  'initial_domain':    1\n",
      "          'max_lp':    3\n",
      "   'quick_restart':    1\n",
      "\n",
      "Solution repositories    Added  Queried  Ignored  Synchro\n",
      "  'feasible solutions':     25      112        0       25\n",
      "        'lp solutions':     42        1        0       38\n",
      "                'pump':     68        7\n",
      "\n",
      "CpSolverResponse summary:\n",
      "status: OPTIMAL\n",
      "objective: 2082\n",
      "best_bound: 2082\n",
      "integers: 24965\n",
      "booleans: 23824\n",
      "conflicts: 0\n",
      "branches: 84047\n",
      "propagations: 1760562\n",
      "integer_propagations: 3714633\n",
      "restarts: 73055\n",
      "lp_iterations: 34459\n",
      "walltime: 8.0343\n",
      "usertime: 8.0343\n",
      "deterministic_time: 20.475\n",
      "gap_integral: 32.1861\n",
      "solution_fingerprint: 0x8d1f59443596df66\n",
      "\n"
     ]
    }
   ],
   "source": [
    "model, x_fill = create_model(k, items, f1)\n",
    "solver = cp_model.CpSolver()\n",
    "solver.parameters.max_time_in_seconds = 60\n",
    "solver.parameters.log_search_progress = True\n",
    "solver.parameters.relative_gap_limit = 0.01\n",
    "status = solver.solve(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Starting CP-SAT solver v9.10.4067\n",
      "Parameters: max_time_in_seconds: 60 log_search_progress: true relative_gap_limit: 0.01\n",
      "Setting number of workers to 8\n",
      "\n",
      "Initial optimization model '': (model_fingerprint: 0x4f81135628206ead)\n",
      "#Variables: 25'250 (#ints: 50 in objective)\n",
      "  - 25'150 Booleans in [0,1]\n",
      "  - 50 in [0,100]\n",
      "  - 50 in [0,1000]\n",
      "#kAtMostOne: 500 (#literals: 25'000)\n",
      "#kExactlyOne: 50 (#literals: 150)\n",
      "#kLinear1: 1'725 (#enforced: 400)\n",
      "#kLinear2: 300 (#enforced: 200)\n",
      "#kLinearN: 50 (#terms: 25'050)\n",
      "\n",
      "Starting presolve at 0.00s\n",
      "  2.52e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  1.26e-02s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  4.41e-04s  0.00e+00d  [ExtractEncodingFromLinear] #potential_supersets=549 #potential_subsets=50 \n",
      "[Symmetry] Graph for symmetry has 50'156 nodes and 72'881 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.0207 dtime: 0.0394826\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] The model contains 100 duplicate constraints !\n",
      "[Symmetry] 2500 orbits with sizes: 18,18,18,18,18,18,18,18,18,18,...\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "[SAT presolve] num removable Booleans: 0 / 23925\n",
      "[SAT presolve] num trivial clauses: 0\n",
      "[SAT presolve] [0s] clauses:12 literals:24 vars:13 one_side_vars:13 simple_definition:0 singleton_clauses:0\n",
      "[SAT presolve] [4.5e-05s] clauses:12 literals:24 vars:13 one_side_vars:13 simple_definition:0 singleton_clauses:0\n",
      "[SAT presolve] [0.000417s] clauses:12 literals:24 vars:13 one_side_vars:13 simple_definition:0 singleton_clauses:0\n",
      "  4.91e-01s  3.40e-01d  [Probe] #probed=48'250 #new_binary_clauses=100 \n",
      "  2.67e-03s  0.00e+00d  [MaxClique] \n",
      "  2.73e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.84e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  4.83e-03s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  8.22e-04s  0.00e+00d  [DetectDuplicateConstraints] #duplicates=150 \n",
      "  2.85e-04s  7.24e-05d  [DetectDominatedLinearConstraints] #relevant_constraints=150 #num_inclusions=50 \n",
      "  1.09e-04s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.06e-03s  1.19e-04d  [ProcessSetPPC] #relevant_constraints=611 \n",
      "  6.90e-05s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  4.19e-02s  1.43e-01d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  5.57e-03s  5.71e-02d  [FindBigVerticalLinearOverlap] \n",
      "  1.32e-03s  5.96e-03d  [FindBigHorizontalLinearOverlap] #linears=50 \n",
      "  2.70e-04s  0.00e+00d  [MergeClauses] \n",
      "  2.64e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  7.59e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  2.55e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  7.57e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "[Symmetry] Graph for symmetry has 50'006 nodes and 72'581 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.019817 dtime: 0.0380117\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] 2500 orbits with sizes: 18,18,18,18,18,18,18,18,18,18,...\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "[SAT presolve] num removable Booleans: 0 / 23925\n",
      "[SAT presolve] num trivial clauses: 0\n",
      "[SAT presolve] [0s] clauses:13 literals:26 vars:15 one_side_vars:15 simple_definition:0 singleton_clauses:0\n",
      "[SAT presolve] [4.7e-05s] clauses:13 literals:26 vars:15 one_side_vars:15 simple_definition:0 singleton_clauses:0\n",
      "[SAT presolve] [0.000416s] clauses:13 literals:26 vars:15 one_side_vars:15 simple_definition:0 singleton_clauses:0\n",
      "  4.92e-01s  3.40e-01d  [Probe] #probed=48'250 #new_binary_clauses=100 \n",
      "  2.71e-03s  0.00e+00d  [MaxClique] \n",
      "  2.63e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.79e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  4.72e-03s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  8.97e-04s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  2.95e-04s  7.24e-05d  [DetectDominatedLinearConstraints] #relevant_constraints=150 #num_inclusions=50 \n",
      "  1.01e-04s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.14e-03s  1.19e-04d  [ProcessSetPPC] #relevant_constraints=611 \n",
      "  6.90e-05s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  4.18e-02s  1.43e-01d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  5.53e-03s  5.71e-02d  [FindBigVerticalLinearOverlap] \n",
      "  1.25e-03s  5.96e-03d  [FindBigHorizontalLinearOverlap] #linears=50 \n",
      "  3.10e-05s  0.00e+00d  [MergeClauses] \n",
      "  2.49e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  7.75e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  4.36e-04s  0.00e+00d  [ExpandObjective] #entries=24'075 #tight_variables=200 #tight_constraints=100 \n",
      "\n",
      "Presolve summary:\n",
      "  - 0 affine relations were detected.\n",
      "  - rule 'TODO dual: only one blocking constraint?' was applied 143'551 times.\n",
      "  - rule 'TODO dual: only one unspecified blocking constraint?' was applied 300 times.\n",
      "  - rule 'TODO symmetry: add symmetry breaking inequalities?' was applied 2 times.\n",
      "  - rule 'at_most_one: removed literals' was applied 49 times.\n",
      "  - rule 'at_most_one: size one' was applied 1 time.\n",
      "  - rule 'deductions: 250 stored' was applied 1 time.\n",
      "  - rule 'domination: added implications' was applied 12 times.\n",
      "  - rule 'duplicate: merged rhs of linear constraint' was applied 150 times.\n",
      "  - rule 'duplicate: removed constraint' was applied 150 times.\n",
      "  - rule 'linear: always true' was applied 200 times.\n",
      "  - rule 'linear: empty' was applied 1'225 times.\n",
      "  - rule 'linear: fixed or dup variables' was applied 1'274 times.\n",
      "  - rule 'linear: reduced variable domains' was applied 1'225 times.\n",
      "  - rule 'linear: simplified rhs' was applied 600 times.\n",
      "  - rule 'presolve: 1225 unused variables removed.' was applied 1 time.\n",
      "  - rule 'presolve: iteration' was applied 2 times.\n",
      "\n",
      "Presolved optimization model '': (model_fingerprint: 0xa9b6022a4cbd48c7)\n",
      "#Variables: 24'025 (#ints: 50 in objective)\n",
      "  - 23'925 Booleans in [0,1]\n",
      "  - 50 in [0,100]\n",
      "  - 50 in [0,1000]\n",
      "#kAtMostOne: 498 (#literals: 23'772)\n",
      "#kBoolAnd: 2 (#enforced: 2) (#literals: 15)\n",
      "#kExactlyOne: 50 (#literals: 150)\n",
      "#kLinear1: 150 (#enforced: 150)\n",
      "#kLinear2: 300 (#enforced: 200)\n",
      "#kLinearN: 50 (#terms: 23'825)\n",
      "\n",
      "Preloading model.\n",
      "#Bound   1.27s best:-inf  next:[-0,5000]  initial_domain\n",
      "[Symmetry] Graph for symmetry has 48'781 nodes and 72'581 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.020644 dtime: 0.0379382\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "#Model   1.30s var:24025/24025 constraints:1050/1050\n",
      "\n",
      "Starting search at 1.30s with 8 workers.\n",
      "6 full problem subsolvers: [core, default_lp, max_lp, no_lp, quick_restart, reduced_costs]\n",
      "1 first solution subsolver: [fj_short_default]\n",
      "9 incomplete subsolvers: [feasibility_pump, graph_arc_lns, graph_cst_lns, graph_dec_lns, graph_var_lns, rins/rens, rnd_cst_lns, rnd_var_lns, violation_ls]\n",
      "3 helper subsolvers: [neighborhood_helper, synchronization_agent, update_gap_integral]\n",
      "#1       1.32s best:-0    next:[1,5000]   fj_short_default(batch:1 #lin_moves:0 #lin_evals:980 #gen_moves:95 #gen_evals:0 #comp_moves:95 #backtracks:0 #weight_updates:0)\n",
      "#2       1.35s best:1     next:[2,5000]   violation_ls(batch:1 #solutions_imported:1 #lin_moves:0 #lin_evals:608 #gen_moves:10 #gen_evals:0 #comp_moves:4 #backtracks:3 #weight_updates:0)\n",
      "#3       1.83s best:101   next:[102,5000] graph_var_lns (d=0.50 s=11 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#4       1.86s best:166   next:[167,5000] rnd_var_lns (d=0.50 s=9 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#5       2.32s best:300   next:[301,5000] graph_arc_lns (d=0.50 s=12 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#6       2.88s best:575   next:[576,5000] graph_dec_lns (d=0.50 s=14 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#7       3.53s best:576   next:[577,5000] violation_ls(batch:2 #solutions_imported:2 #lin_moves:0 #lin_evals:1'022 #gen_moves:18 #gen_evals:0 #comp_moves:12 #backtracks:3 #weight_updates:0)\n",
      "#8       3.64s best:715   next:[716,5000] rnd_var_lns (d=0.29 s=19 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#9       3.88s best:815   next:[816,5000] graph_var_lns (d=0.71 s=21 t=0.10 p=1.00 stall=0 h=auto_l0)\n",
      "#10      3.97s best:915   next:[916,5000] graph_arc_lns (d=0.29 s=22 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#Bound   4.00s best:915   next:[916,2196] max_lp\n",
      "#11      4.09s best:935   next:[936,2196] graph_cst_lns (d=0.29 s=23 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#Bound   4.24s best:935   next:[936,2106] max_lp\n",
      "#12      4.29s best:1160  next:[1161,2106] graph_dec_lns (d=0.29 s=24 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#13      4.65s best:1162  next:[1163,2106] violation_ls(batch:3 #solutions_imported:3 #lin_moves:0 #lin_evals:1'638 #gen_moves:35 #gen_evals:0 #comp_moves:13 #backtracks:11 #weight_updates:0)\n",
      "#14      4.73s best:1927  next:[1928,2106] rens_pump_lns (d=0.19 s=26 t=0.10 p=0.00 stall=2 h=auto_l0)\n",
      "#15      4.96s best:1961  next:[1962,2106] rnd_cst_lns (d=0.19 s=29 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#16      5.47s best:1964  next:[1965,2106] graph_cst_lns (d=0.46 s=32 t=0.10 p=0.50 stall=0 h=auto_l0)\n",
      "#17      5.47s best:1967  next:[1968,2106] graph_dec_lns (d=0.19 s=33 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#18      5.71s best:1969  next:[1970,2106] violation_ls(batch:4 #solutions_imported:4 #lin_moves:1 #lin_evals:1'680 #gen_moves:35 #gen_evals:0 #comp_moves:13 #backtracks:11 #weight_updates:0)\n",
      "#19      5.92s best:1970  next:[1971,2106] rnd_cst_lns (d=0.12 s=38 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#20      6.14s best:1980  next:[1981,2106] graph_arc_lns (d=0.31 s=40 t=0.10 p=0.33 stall=1 h=auto_l0)\n",
      "#21      6.29s best:1991  next:[1992,2106] graph_dec_lns (d=0.12 s=42 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#22      6.34s best:1992  next:[1993,2106] violation_ls(batch:5 #solutions_imported:5 #lin_moves:1 #lin_evals:1'691 #gen_moves:42 #gen_evals:0 #comp_moves:14 #backtracks:14 #weight_updates:0)\n",
      "#23      6.67s best:1994  next:[1995,2106] rnd_cst_lns (d=0.09 s=47 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#24      7.27s best:1995  next:[1996,2106] violation_ls(batch:6 #solutions_imported:6 #lin_moves:1 #lin_evals:3'963 #gen_moves:115 #gen_evals:0 #comp_moves:19 #backtracks:48 #weight_updates:0)\n",
      "#25      7.40s best:1996  next:[1997,2106] rnd_var_lns (d=0.30 s=55 t=0.10 p=0.40 stall=2 h=auto_l0)\n",
      "#26      7.91s best:1997  next:[1998,2106] violation_ls(batch:7 #solutions_imported:7 #lin_moves:6 #lin_evals:4'558 #gen_moves:115 #gen_evals:0 #comp_moves:19 #backtracks:48 #weight_updates:4)\n",
      "#Bound   8.30s best:1997  next:[1998,2094] max_lp\n",
      "#Bound   9.38s best:1997  next:[1998,2088] max_lp\n",
      "#Model   9.42s var:24024/24025 constraints:1048/1050\n",
      "#Bound   9.74s best:1997  next:[1998,2082] max_lp\n",
      "#Model  11.28s var:24023/24025 constraints:1046/1050\n",
      "#27     20.02s best:1998  next:[1999,2082] rnd_cst_lns (d=0.07 s=209 t=0.10 p=0.41 stall=17 h=folio_rnd)\n",
      "#28     22.05s best:1999  next:[2000,2082] violation_ls(batch:26 #solutions_imported:9 #lin_moves:6 #lin_evals:1'478'797 #gen_moves:42'962 #gen_evals:0 #comp_moves:5'008 #backtracks:18'965 #weight_updates:26)\n",
      "#29     22.97s best:2000  next:[2001,2082] violation_ls(batch:27 #solutions_imported:10 #lin_moves:69 #lin_evals:1'484'934 #gen_moves:42'962 #gen_evals:0 #comp_moves:5'008 #backtracks:18'965 #weight_updates:69)\n",
      "#30     23.37s best:2001  next:[2002,2082] violation_ls(batch:28 #solutions_imported:11 #lin_moves:78 #lin_evals:1'487'172 #gen_moves:42'962 #gen_evals:0 #comp_moves:5'008 #backtracks:18'965 #weight_updates:77)\n",
      "#31     24.28s best:2002  next:[2003,2082] violation_ls(batch:29 #solutions_imported:12 #lin_moves:87 #lin_evals:1'488'188 #gen_moves:42'962 #gen_evals:0 #comp_moves:5'008 #backtracks:18'965 #weight_updates:89)\n",
      "#32     25.44s best:2003  next:[2004,2082] violation_ls(batch:30 #solutions_imported:13 #lin_moves:110 #lin_evals:1'490'910 #gen_moves:42'962 #gen_evals:0 #comp_moves:5'008 #backtracks:18'965 #weight_updates:104)\n",
      "#33     26.17s best:2004  next:[2005,2082] violation_ls(batch:31 #solutions_imported:14 #lin_moves:129 #lin_evals:1'492'177 #gen_moves:42'962 #gen_evals:0 #comp_moves:5'008 #backtracks:18'965 #weight_updates:126)\n",
      "#34     26.91s best:2005  next:[2006,2082] rins_lp_lns (d=0.02 s=287 t=0.10 p=0.31 stall=26 h=folio_rnd)\n",
      "#35     26.93s best:2006  next:[2007,2082] violation_ls(batch:32 #solutions_imported:15 #lin_moves:185 #lin_evals:1'498'466 #gen_moves:42'962 #gen_evals:0 #comp_moves:5'008 #backtracks:18'965 #weight_updates:164)\n",
      "#36     30.39s best:2007  next:[2008,2082] rnd_cst_lns (d=0.08 s=326 t=0.10 p=0.46 stall=12 h=auto_l0)\n",
      "#37     30.99s best:2008  next:[2009,2082] violation_ls(batch:37 #solutions_imported:17 #lin_moves:10'502 #lin_evals:1'641'815 #gen_moves:43'491 #gen_evals:0 #comp_moves:5'021 #backtracks:19'223 #weight_updates:29'847)\n",
      "#38     35.27s best:2011  next:[2012,2082] rnd_cst_lns (d=0.11 s=380 t=0.10 p=0.49 stall=5 h=auto_l0)\n",
      "#39     46.98s best:2014  next:[2015,2082] graph_dec_lns (d=0.12 s=492 t=0.10 p=0.47 stall=49 h=auto_l0)\n",
      "#40     47.03s best:2015  next:[2016,2082] violation_ls(batch:55 #solutions_imported:20 #lin_moves:66'914 #lin_evals:2'563'164 #gen_moves:61'597 #gen_evals:0 #comp_moves:5'060 #backtracks:28'250 #weight_updates:93'457)\n",
      "#41     47.64s best:2016  next:[2017,2082] violation_ls(batch:56 #solutions_imported:21 #lin_moves:66'951 #lin_evals:2'569'059 #gen_moves:61'597 #gen_evals:0 #comp_moves:5'060 #backtracks:28'250 #weight_updates:93'483)\n",
      "#42     59.56s best:2017  next:[2018,2082] graph_var_lns (d=0.07 s=624 t=0.10 p=0.43 stall=66 h=auto_l0)\n",
      "\n",
      "Task timing                   n [     min,      max]      avg      dev     time         n [     min,      max]      avg      dev    dtime\n",
      "              'core':         1 [  58.70s,   58.70s]   58.70s   0.00ns   58.70s         1 [  13.29s,   13.29s]   13.29s   0.00ns   13.29s\n",
      "        'default_lp':         1 [  58.70s,   58.70s]   58.70s   0.00ns   58.70s         1 [  33.04s,   33.04s]   33.04s   0.00ns   33.04s\n",
      "  'feasibility_pump':        69 [  2.92ms, 543.80ms] 319.76ms  74.11ms   22.06s        67 [ 40.89ms,  73.23ms]  43.67ms   4.00ms    2.93s\n",
      "  'fj_short_default':         1 [ 19.60ms,  19.60ms]  19.60ms   0.00ns  19.60ms         1 [258.18us, 258.18us] 258.18us   0.00ns 258.18us\n",
      "     'graph_arc_lns':        69 [ 26.76ms, 485.97ms] 160.29ms 100.15ms   11.06s        69 [ 10.00ns, 154.50ms]  57.57ms  49.25ms    3.97s\n",
      "     'graph_cst_lns':        69 [  8.62ms,    1.15s] 150.90ms 156.75ms   10.41s        57 [ 10.00ns, 105.35ms]  62.37ms  43.71ms    3.55s\n",
      "     'graph_dec_lns':        69 [ 34.54ms, 562.85ms] 169.43ms 105.97ms   11.69s        69 [ 10.00ns, 105.35ms]  55.24ms  47.50ms    3.81s\n",
      "     'graph_var_lns':        69 [ 58.52ms, 368.34ms] 190.30ms  75.35ms   13.13s        69 [788.77us, 117.95ms]  74.47ms  36.43ms    5.14s\n",
      "            'max_lp':         1 [  58.70s,   58.70s]   58.70s   0.00ns   58.70s         1 [  19.37s,   19.37s]   19.37s   0.00ns   19.37s\n",
      "             'no_lp':         1 [  58.70s,   58.70s]   58.70s   0.00ns   58.70s         1 [   2.80s,    2.80s]    2.80s   0.00ns    2.80s\n",
      "     'quick_restart':         1 [  58.73s,   58.73s]   58.73s   0.00ns   58.73s         1 [  30.96s,   30.96s]   30.96s   0.00ns   30.96s\n",
      "     'reduced_costs':         1 [  58.70s,   58.70s]   58.70s   0.00ns   58.70s         1 [  27.19s,   27.19s]   27.19s   0.00ns   27.19s\n",
      "         'rins/rens':        69 [ 13.86ms, 697.49ms] 272.64ms 191.45ms   18.81s        63 [ 10.00ns, 136.23ms]  68.01ms  48.41ms    4.28s\n",
      "       'rnd_cst_lns':        69 [ 28.34ms, 930.33ms] 173.46ms 123.11ms   11.97s        69 [ 10.00ns, 167.80ms]  63.46ms  49.31ms    4.38s\n",
      "       'rnd_var_lns':        69 [ 39.34ms, 556.45ms] 169.88ms 107.25ms   11.72s        69 [ 10.00ns, 126.60ms]  58.64ms  47.65ms    4.05s\n",
      "      'violation_ls':        69 [837.00us, 473.68ms]  85.53ms  86.64ms    5.90s        69 [  5.34us, 158.17ms]  38.94ms  41.19ms    2.69s\n",
      "\n",
      "Search stats         Bools  Conflicts  Branches  Restarts  BoolPropag  IntegerPropag\n",
      "           'core':  24'175    100'127   190'597    48'251  68'591'105     96'343'646\n",
      "     'default_lp':  24'535        585   399'910   277'501   8'320'270     17'226'736\n",
      "         'max_lp':  24'204      1'805   749'236   378'686  10'826'694     23'045'355\n",
      "          'no_lp':  24'125     16'328   137'175    96'133   5'614'809      9'575'606\n",
      "  'quick_restart':  24'199         98   528'691   466'988  12'280'567     25'509'873\n",
      "  'reduced_costs':  25'026      3'968   310'983   192'155   5'025'736     10'475'739\n",
      "\n",
      "SAT stats           ClassicMinim   LitRemoved  LitLearned  LitForgotten  Subsumed  MClauses  MDecisions  MLitTrue  MSubsumed  MLitRemoved  MReused\n",
      "           'core':        81'345      557'826  86'483'346    73'729'712     5'221         0           0         0          0            0        0\n",
      "     'default_lp':           390       74'005     639'691             0       126       588       3'004         0          0            0        0\n",
      "         'max_lp':         1'675    1'284'305  12'449'654             0        43       774       3'870         0          0            0        0\n",
      "          'no_lp':        15'922  173'710'051  54'863'559     7'536'932       138       100         500         0          0            0        0\n",
      "  'quick_restart':            71       85'420     382'453             0         0       936       4'635         0          8           36       46\n",
      "  'reduced_costs':         3'335       20'128  11'126'919             0       156       441       5'250         0         50          521      166\n",
      "\n",
      "Lp stats            Component  Iterations  AddedCuts  OPTIMAL  DUAL_F.  DUAL_U.\n",
      "     'default_lp':          1     183'355      1'170    2'813      232      234\n",
      "         'max_lp':          1     108'310        527    1'559    3'939      407\n",
      "  'quick_restart':          1     172'800        740    2'598      255       10\n",
      "  'reduced_costs':          1      85'721        690      386    6'500    2'982\n",
      "\n",
      "Lp dimension                                                           Final dimension of first component\n",
      "     'default_lp':  590 rows, 23875 columns, 47541 entries with magnitude in [1.414214e-01, 1.000000e+00]\n",
      "         'max_lp':  544 rows, 24025 columns, 44398 entries with magnitude in [2.648427e-02, 1.000000e+00]\n",
      "  'quick_restart':  624 rows, 23875 columns, 50493 entries with magnitude in [7.884833e-02, 1.000000e+00]\n",
      "  'reduced_costs':  583 rows, 24025 columns, 43189 entries with magnitude in [5.915464e-02, 1.000000e+00]\n",
      "\n",
      "Lp debug            CutPropag  CutEqPropag  Adjust  Overflow  Bad  BadScaling\n",
      "     'default_lp':          0            0   3'140         0  590           0\n",
      "         'max_lp':          0            0   3'672         0  290           0\n",
      "  'quick_restart':          0            0   1'936         0  431           0\n",
      "  'reduced_costs':          0            0   4'916         0  343           0\n",
      "\n",
      "Lp pool             Constraints  Updates  Simplif  Merged  Shortened  Split  Strenghtened    Cuts/Call\n",
      "     'default_lp':        1'818        1        0       0          0      0             0  1'170/2'033\n",
      "         'max_lp':        1'538        6       30       0          6      0            30      527/931\n",
      "  'quick_restart':        1'388        0        0       0          0      0             0    740/1'381\n",
      "  'reduced_costs':        1'701        0       18       0          8      0             4    690/1'322\n",
      "\n",
      "Lp Cut        default_lp  max_lp  quick_restart  reduced_costs\n",
      "      CG_FF:         139      40             77             45\n",
      "       CG_K:         148      40             85             69\n",
      "       CG_R:         185      28            124            104\n",
      "      CG_RB:           -      35              -             40\n",
      "     CG_RBP:          11       -             11             38\n",
      "         IB:           -      99              -             85\n",
      "   MIR_1_FF:           -      20              -              -\n",
      "    MIR_1_K:           -       2              -              -\n",
      "   MIR_1_KL:           -       2              -              -\n",
      "   MIR_1_RB:           -       6              -              -\n",
      "  MIR_1_RLT:           -      20              -              -\n",
      "   MIR_2_FF:         176      49            138            100\n",
      "    MIR_2_K:         175      49            136            100\n",
      "    MIR_2_R:         177      43            139             99\n",
      "   MIR_2_RB:           -      11              -              -\n",
      "   MIR_3_FF:          33      24              6              2\n",
      "    MIR_3_K:          45      23              9              3\n",
      "    MIR_3_R:          30      14              6              2\n",
      "   MIR_4_FF:           1       3              -              -\n",
      "    MIR_4_K:           2       1              -              -\n",
      "    MIR_4_R:           1       -              -              -\n",
      "   MIR_5_FF:          15       6              3              1\n",
      "    MIR_5_K:          16       6              3              1\n",
      "    MIR_5_R:          16       6              3              1\n",
      "\n",
      "LNS stats           Improv/Calls  Closed  Difficulty  TimeLimit\n",
      "  'graph_arc_lns':          3/69     48%        0.12       0.10\n",
      "  'graph_cst_lns':          3/57     47%        0.12       0.10\n",
      "  'graph_dec_lns':          5/69     48%        0.12       0.10\n",
      "  'graph_var_lns':          3/69     42%        0.06       0.10\n",
      "      'rins/rens':          2/66     42%        0.02       0.10\n",
      "    'rnd_cst_lns':          7/69     45%        0.05       0.10\n",
      "    'rnd_var_lns':          4/69     48%        0.15       0.10\n",
      "\n",
      "LS stats               Batches  Restarts  LinMoves  GenMoves  CompoundMoves  WeightUpdates\n",
      "  'fj_short_default':        1         1         0        95             95              0\n",
      "      'violation_ls':       69         0   195'375    61'597          5'060         95'059\n",
      "\n",
      "Solutions (42)         Num     Rank\n",
      "  'fj_short_default':    1    [1,1]\n",
      "     'graph_arc_lns':    3   [5,20]\n",
      "     'graph_cst_lns':    2  [11,16]\n",
      "     'graph_dec_lns':    5   [6,39]\n",
      "     'graph_var_lns':    3   [3,42]\n",
      "     'rens_pump_lns':    1  [14,14]\n",
      "       'rins_lp_lns':    1  [34,34]\n",
      "       'rnd_cst_lns':    6  [15,38]\n",
      "       'rnd_var_lns':    3   [4,25]\n",
      "      'violation_ls':   17   [2,41]\n",
      "\n",
      "Objective bounds     Num\n",
      "  'initial_domain':    1\n",
      "          'max_lp':    5\n",
      "\n",
      "Solution repositories    Added  Queried  Ignored  Synchro\n",
      "  'feasible solutions':    224    1'088        0      224\n",
      "        'lp solutions':    770       31        4      538\n",
      "                'pump':    678       38\n",
      "\n",
      "Improving bounds shared    Num\n",
      "                'max_lp':    4\n",
      "\n",
      "Clauses shared    Num\n",
      "       'max_lp':    2\n",
      "\n",
      "CpSolverResponse summary:\n",
      "status: FEASIBLE\n",
      "objective: 2017\n",
      "best_bound: 2082\n",
      "integers: 24965\n",
      "booleans: 24535\n",
      "conflicts: 585\n",
      "branches: 399910\n",
      "propagations: 8320270\n",
      "integer_propagations: 17226736\n",
      "restarts: 277501\n",
      "lp_iterations: 183355\n",
      "walltime: 60.2768\n",
      "usertime: 60.2768\n",
      "deterministic_time: 162.533\n",
      "gap_integral: 684.969\n",
      "solution_fingerprint: 0x8b7f79b3f063a238\n",
      "\n"
     ]
    }
   ],
   "source": [
    "model, x_fill = create_model(k, items, f2)\n",
    "solver = cp_model.CpSolver()\n",
    "solver.parameters.max_time_in_seconds = 60\n",
    "solver.parameters.log_search_progress = True\n",
    "solver.parameters.relative_gap_limit = 0.01\n",
    "status = solver.solve(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Starting CP-SAT solver v9.10.4067\n",
      "Parameters: max_time_in_seconds: 60 log_search_progress: true relative_gap_limit: 0.01\n",
      "Setting number of workers to 8\n",
      "\n",
      "Initial optimization model '': (model_fingerprint: 0x68e836eb86ef8609)\n",
      "#Variables: 25'300 (#ints: 50 in objective)\n",
      "  - 25'200 Booleans in [0,1]\n",
      "  - 50 in [0,100]\n",
      "  - 50 in [0,1000]\n",
      "#kAtMostOne: 500 (#literals: 25'000)\n",
      "#kLinear1: 1'325\n",
      "#kLinear2: 150\n",
      "#kLinearN: 200 (#terms: 25'800)\n",
      "\n",
      "Starting presolve at 0.00s\n",
      "  3.11e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  1.39e-02s  0.00e+00d  [PresolveToFixPoint] #num_loops=2 #num_dual_strengthening=1 \n",
      "  4.01e-04s  0.00e+00d  [ExtractEncodingFromLinear] #potential_supersets=499 #potential_subsets=100 \n",
      "[Symmetry] Graph for symmetry has 50'306 nodes and 72'931 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.021165 dtime: 0.0394685\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] 2500 orbits with sizes: 18,18,18,18,18,18,18,18,18,18,...\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "[SAT presolve] num removable Booleans: 0 / 23975\n",
      "[SAT presolve] num trivial clauses: 0\n",
      "[SAT presolve] [0s] clauses:162 literals:324 vars:213 one_side_vars:113 simple_definition:100 singleton_clauses:0\n",
      "[SAT presolve] [4.8e-05s] clauses:162 literals:324 vars:213 one_side_vars:113 simple_definition:100 singleton_clauses:0\n",
      "[SAT presolve] [0.000474s] clauses:162 literals:324 vars:213 one_side_vars:113 simple_definition:100 singleton_clauses:0\n",
      "  4.98e-01s  3.39e-01d  [Probe] #probed=47'950 \n",
      "  3.39e-03s  0.00e+00d  [MaxClique] Merged 711(24198 literals) into 661(24098 literals) at_most_ones. \n",
      "  2.78e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  9.69e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  4.90e-03s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  6.33e-04s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  2.61e-04s  7.45e-05d  [DetectDominatedLinearConstraints] #relevant_constraints=200 #num_inclusions=50 \n",
      "  1.03e-04s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.55e-03s  1.21e-04d  [ProcessSetPPC] #relevant_constraints=861 \n",
      "  8.20e-05s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  4.21e-02s  1.43e-01d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  5.46e-03s  5.71e-02d  [FindBigVerticalLinearOverlap] \n",
      "  4.78e-03s  2.38e-02d  [FindBigHorizontalLinearOverlap] #linears=200 \n",
      "  5.63e-04s  0.00e+00d  [MergeClauses] \n",
      "  2.70e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.24e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  2.98e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.55e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "[Symmetry] Graph for symmetry has 50'306 nodes and 72'931 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.020848 dtime: 0.038242\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] 2500 orbits with sizes: 18,18,18,18,18,18,18,18,18,18,...\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "[SAT presolve] num removable Booleans: 0 / 23975\n",
      "[SAT presolve] num trivial clauses: 0\n",
      "[SAT presolve] [0s] clauses:163 literals:326 vars:215 one_side_vars:115 simple_definition:100 singleton_clauses:0\n",
      "[SAT presolve] [4.8e-05s] clauses:163 literals:326 vars:215 one_side_vars:115 simple_definition:100 singleton_clauses:0\n",
      "[SAT presolve] [0.000463s] clauses:163 literals:326 vars:215 one_side_vars:115 simple_definition:100 singleton_clauses:0\n",
      "  5.62e-01s  3.39e-01d  [Probe] #probed=47'950 \n",
      "  3.71e-03s  0.00e+00d  [MaxClique] \n",
      "  3.02e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  9.90e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  5.04e-03s  0.00e+00d  [ProcessAtMostOneAndLinear] \n",
      "  6.10e-04s  0.00e+00d  [DetectDuplicateConstraints] \n",
      "  3.04e-04s  7.45e-05d  [DetectDominatedLinearConstraints] #relevant_constraints=200 #num_inclusions=50 \n",
      "  1.00e-04s  0.00e+00d  [DetectDifferentVariables] \n",
      "  1.99e-03s  1.21e-04d  [ProcessSetPPC] #relevant_constraints=861 \n",
      "  8.10e-05s  0.00e+00d  [FindAlmostIdenticalLinearConstraints] \n",
      "  4.21e-02s  1.43e-01d  [FindBigAtMostOneAndLinearOverlap] \n",
      "  5.68e-03s  5.71e-02d  [FindBigVerticalLinearOverlap] \n",
      "  4.76e-03s  2.38e-02d  [FindBigHorizontalLinearOverlap] #linears=200 \n",
      "  3.40e-05s  0.00e+00d  [MergeClauses] \n",
      "  3.15e-03s  0.00e+00d  [DetectDominanceRelations] \n",
      "  8.89e-03s  0.00e+00d  [PresolveToFixPoint] #num_loops=1 #num_dual_strengthening=1 \n",
      "  6.40e-04s  0.00e+00d  [ExpandObjective] #entries=23'975 #tight_variables=100 #tight_constraints=100 #expands=50 \n",
      "\n",
      "Presolve summary:\n",
      "  - 50 affine relations were detected.\n",
      "  - rule 'TODO dual: only one blocking constraint?' was applied 142'951 times.\n",
      "  - rule 'TODO linear2: contains a Boolean.' was applied 300 times.\n",
      "  - rule 'TODO symmetry: add symmetry breaking inequalities?' was applied 2 times.\n",
      "  - rule 'affine: new relation' was applied 50 times.\n",
      "  - rule 'at_most_one: removed literals' was applied 49 times.\n",
      "  - rule 'at_most_one: size one' was applied 1 time.\n",
      "  - rule 'at_most_one: transformed into max clique.' was applied 1 time.\n",
      "  - rule 'bool_or: implications' was applied 150 times.\n",
      "  - rule 'domination: added implications' was applied 12 times.\n",
      "  - rule 'linear: always true' was applied 100 times.\n",
      "  - rule 'linear: divide by GCD' was applied 50 times.\n",
      "  - rule 'linear: empty' was applied 1'225 times.\n",
      "  - rule 'linear: extracted at most one (min).' was applied 50 times.\n",
      "  - rule 'linear: fixed or dup variables' was applied 1'274 times.\n",
      "  - rule 'linear: positive clause' was applied 150 times.\n",
      "  - rule 'linear: reduced variable domains' was applied 1'275 times.\n",
      "  - rule 'linear: remapped using affine relations' was applied 50 times.\n",
      "  - rule 'linear: simplified rhs' was applied 250 times.\n",
      "  - rule 'objective: expanded via tight equality' was applied 50 times.\n",
      "  - rule 'presolve: 1225 unused variables removed.' was applied 1 time.\n",
      "  - rule 'presolve: iteration' was applied 2 times.\n",
      "  - rule 'variables: canonicalize affine domain' was applied 50 times.\n",
      "\n",
      "Presolved optimization model '': (model_fingerprint: 0x1045e621b41bcfd9)\n",
      "#Variables: 24'075 (#bools: 200 in objective)\n",
      "  - 23'975 Booleans in [0,1]\n",
      "  - 50 in [0,1][3,5]\n",
      "  - 50 in [0,1000]\n",
      "#kAtMostOne: 498 (#literals: 23'772)\n",
      "#kBoolAnd: 152 (#enforced: 152) (#literals: 315)\n",
      "#kLinearN: 200 (#terms: 24'575)\n",
      "\n",
      "Preloading model.\n",
      "#Bound   1.37s best:-inf  next:[-0,5000]  initial_domain\n",
      "[Symmetry] Graph for symmetry has 49'031 nodes and 72'931 arcs.\n",
      "[Symmetry] Symmetry computation done. time: 0.0218 dtime: 0.0370195\n",
      "[Symmetry] #generators: 401, average support size: 100\n",
      "[Symmetry] Found orbitope of size 50 x 18\n",
      "#Model   1.40s var:24075/24075 constraints:850/850\n",
      "\n",
      "Starting search at 1.40s with 8 workers.\n",
      "6 full problem subsolvers: [core, default_lp, max_lp, no_lp, quick_restart, reduced_costs]\n",
      "1 first solution subsolver: [fj_short_default]\n",
      "9 incomplete subsolvers: [feasibility_pump, graph_arc_lns, graph_cst_lns, graph_dec_lns, graph_var_lns, rins/rens, rnd_cst_lns, rnd_var_lns, violation_ls]\n",
      "3 helper subsolvers: [neighborhood_helper, synchronization_agent, update_gap_integral]\n",
      "#1       1.41s best:-0    next:[20,5000]  fj_short_default(batch:1 #lin_moves:0 #lin_evals:0 #weight_updates:0)\n",
      "#2       1.45s best:20    next:[40,5000]  violation_ls(batch:1 #solutions_imported:1 #lin_moves:0 #lin_evals:1'396 #gen_moves:261 #gen_evals:0 #comp_moves:15 #backtracks:123 #weight_updates:0)\n",
      "#3       1.54s best:460   next:[480,5000] rnd_var_lns (d=0.50 s=9 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#4       1.63s best:560   next:[580,5000] graph_var_lns (d=0.50 s=11 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#5       1.72s best:780   next:[800,5000] graph_arc_lns (d=0.50 s=12 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#6       1.85s best:880   next:[900,5000] graph_cst_lns (d=0.50 s=13 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#7       2.50s best:1540  next:[1560,5000] graph_dec_lns (d=0.50 s=14 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#Bound   3.54s best:1540  next:[1560,4760] max_lp\n",
      "#Bound   3.70s best:1540  next:[1560,4240] max_lp\n",
      "#8       3.75s best:1620  next:[1640,4240] graph_dec_lns (d=0.29 s=24 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#Bound   3.95s best:1620  next:[1640,2260] max_lp\n",
      "#9       4.20s best:1680  next:[1700,2260] rnd_cst_lns (d=0.19 s=29 t=0.10 p=0.00 stall=2 h=auto_l0)\n",
      "#10      4.89s best:1760  next:[1780,2260] graph_dec_lns (d=0.19 s=33 t=0.10 p=0.00 stall=0 h=auto_l0)\n",
      "#11      7.73s best:1780  next:[1800,2260] violation_ls(batch:7 #solutions_imported:4 #lin_moves:15'648 #lin_evals:314'172 #gen_moves:7'839 #gen_evals:0 #comp_moves:627 #backtracks:3'606 #weight_updates:4'377)\n",
      "#12      8.03s best:1800  next:[1820,2260] graph_arc_lns (d=0.13 s=67 t=0.10 p=0.17 stall=5 h=auto_l0)\n",
      "#13      8.17s best:1880  next:[1900,2260] graph_dec_lns (d=0.18 s=69 t=0.10 p=0.33 stall=3 h=auto_l0)\n",
      "#14      9.38s best:1960  next:[1980,2260] graph_dec_lns (d=0.17 s=87 t=0.10 p=0.38 stall=1 h=auto_l0)\n",
      "#15     10.23s best:1980  next:[2000,2260] graph_dec_lns (d=0.23 s=96 t=0.10 p=0.44 stall=0 h=auto_l0)\n",
      "#16     11.87s best:2060  next:[2080,2260] graph_dec_lns (d=0.23 s=114 t=0.10 p=0.45 stall=1 h=auto_l0)\n",
      "#17     18.59s best:2200  next:[2220,2260] default_lp (fixed_bools=0/23975)\n",
      "#Model  36.05s var:23981/24075 constraints:756/850\n",
      "\n",
      "Task timing                   n [     min,      max]      avg      dev     time         n [     min,      max]      avg      dev    dtime\n",
      "              'core':         1 [  58.50s,   58.50s]   58.50s   0.00ns   58.50s         1 [   1.89m,    1.89m]    1.89m   0.00ns    1.89m\n",
      "        'default_lp':         1 [  58.51s,   58.51s]   58.51s   0.00ns   58.51s         1 [  34.72s,   34.72s]   34.72s   0.00ns   34.72s\n",
      "  'feasibility_pump':        64 [ 37.99ms, 550.79ms] 363.02ms  61.07ms   23.23s        63 [ 43.93ms, 110.46ms]  47.21ms   8.45ms    2.97s\n",
      "  'fj_short_default':         1 [  9.77ms,   9.77ms]   9.77ms   0.00ns   9.77ms         0 [  0.00ns,   0.00ns]   0.00ns   0.00ns   0.00ns\n",
      "     'graph_arc_lns':        63 [ 34.63ms, 449.97ms] 176.97ms  80.62ms   11.15s        63 [313.00ns, 132.81ms]  66.00ms  44.15ms    4.16s\n",
      "     'graph_cst_lns':        63 [ 13.35ms, 430.69ms] 200.54ms 115.14ms   12.63s        61 [ 10.00ns, 151.38ms]  68.06ms  44.02ms    4.15s\n",
      "     'graph_dec_lns':        63 [ 46.42ms, 676.85ms] 164.64ms 114.76ms   10.37s        63 [213.85us, 135.21ms]  56.84ms  48.35ms    3.58s\n",
      "     'graph_var_lns':        63 [ 50.23ms, 543.05ms] 196.64ms 101.54ms   12.39s        63 [905.00ns, 150.98ms]  71.24ms  41.19ms    4.49s\n",
      "            'max_lp':         1 [  58.51s,   58.51s]   58.51s   0.00ns   58.51s         1 [  28.99s,   28.99s]   28.99s   0.00ns   28.99s\n",
      "             'no_lp':         1 [  58.50s,   58.50s]   58.50s   0.00ns   58.50s         1 [  25.11s,   25.11s]   25.11s   0.00ns   25.11s\n",
      "     'quick_restart':         1 [  58.51s,   58.51s]   58.51s   0.00ns   58.51s         1 [  27.23s,   27.23s]   27.23s   0.00ns   27.23s\n",
      "     'reduced_costs':         1 [  58.50s,   58.50s]   58.50s   0.00ns   58.50s         1 [  12.93s,   12.93s]   12.93s   0.00ns   12.93s\n",
      "         'rins/rens':        64 [ 10.55ms, 636.36ms] 193.94ms 165.23ms   12.41s        57 [ 10.00ns, 117.41ms]  59.47ms  48.74ms    3.39s\n",
      "       'rnd_cst_lns':        63 [ 44.62ms, 486.35ms] 199.92ms 107.42ms   12.60s        63 [ 15.13us, 119.42ms]  69.48ms  41.10ms    4.38s\n",
      "       'rnd_var_lns':        63 [ 50.89ms, 428.10ms] 199.63ms 105.71ms   12.58s        63 [469.16us, 122.63ms]  63.46ms  42.96ms    4.00s\n",
      "      'violation_ls':        63 [ 11.79ms, 275.52ms] 144.58ms  50.79ms    9.11s        63 [524.09us, 143.55ms]  60.57ms  27.83ms    3.82s\n",
      "\n",
      "Search stats         Bools  Conflicts  Branches  Restarts  BoolPropag  IntegerPropag\n",
      "           'core':  23'975    113'686   201'168    47'951  26'499'021     26'048'856\n",
      "     'default_lp':  23'975        262   219'660   190'849   4'639'104      9'740'569\n",
      "         'max_lp':  23'975      7'121   291'858   190'854   5'478'744     11'643'060\n",
      "          'no_lp':  23'975    105'447   284'758   143'219  56'293'436     83'471'979\n",
      "  'quick_restart':  23'975        101   626'273   578'331  13'985'662     29'399'679\n",
      "  'reduced_costs':  23'975     44'939   157'989    95'584   2'679'141      6'057'296\n",
      "\n",
      "SAT stats           ClassicMinim  LitRemoved   LitLearned  LitForgotten  Subsumed  MClauses  MDecisions  MLitTrue  MSubsumed  MLitRemoved  MReused\n",
      "           'core':        94'379     432'512  271'167'770   235'966'537       683         0           0         0          0            0        0\n",
      "     'default_lp':           250      17'853       85'510             0         1         0           0         0          0            0        0\n",
      "         'max_lp':         7'070     632'312    5'848'853             0        17         0           0         0          0            0        0\n",
      "          'no_lp':       103'623   1'072'003  104'186'154    90'419'405        86         0           0         0          0            0        0\n",
      "  'quick_restart':            89      30'310      154'371             0         1        10       1'005         0          0            0      115\n",
      "  'reduced_costs':        44'939   3'314'128    3'957'367     2'987'042         0         0           0         0          0            0        0\n",
      "\n",
      "Lp stats            Component  Iterations  AddedCuts  OPTIMAL  DUAL_F.  DUAL_U.\n",
      "     'default_lp':          1     259'383      1'079      466      437       89\n",
      "         'max_lp':          1     179'842      1'617    1'113    6'438    1'186\n",
      "  'quick_restart':          1     128'163      4'140    3'175      182       39\n",
      "  'reduced_costs':          1     273'759        929       14   26'681      137\n",
      "\n",
      "Lp dimension                                                           Final dimension of first component\n",
      "     'default_lp':  689 rows, 24075 columns, 54558 entries with magnitude in [5.239683e-02, 1.000000e+00]\n",
      "         'max_lp':  777 rows, 24075 columns, 76925 entries with magnitude in [1.871962e-03, 1.000000e+00]\n",
      "  'quick_restart':  706 rows, 24075 columns, 48034 entries with magnitude in [1.159355e-01, 1.000000e+00]\n",
      "  'reduced_costs':  500 rows, 24075 columns, 40901 entries with magnitude in [1.291511e-01, 1.000000e+00]\n",
      "\n",
      "Lp debug            CutPropag  CutEqPropag  Adjust  Overflow    Bad  BadScaling\n",
      "     'default_lp':          0            0     672         0    439           0\n",
      "         'max_lp':          0           18   3'221         0    941           0\n",
      "  'quick_restart':          0           56   2'255         0  2'181           0\n",
      "  'reduced_costs':          0            0      34         0    428           0\n",
      "\n",
      "Lp pool             Constraints  Updates  Simplif  Merged  Shortened  Split  Strenghtened    Cuts/Call\n",
      "     'default_lp':        1'777        0        0       0          0      0           284  1'079/1'596\n",
      "         'max_lp':        2'471        6      648       7        636      0           514  1'617/2'251\n",
      "  'quick_restart':        4'837      143    1'497       1      1'432      1           964  4'140/6'461\n",
      "  'reduced_costs':        1'790        0        0       0          0      0           289    929/1'459\n",
      "\n",
      "Lp Cut           default_lp  max_lp  quick_restart  reduced_costs\n",
      "         CG_FF:          76     179            431             63\n",
      "          CG_K:          72     118            257             56\n",
      "          CG_R:         134     175            474            127\n",
      "         CG_RB:           -     335            508              -\n",
      "        CG_RBP:           -      16             73              -\n",
      "            IB:         100     130            230              2\n",
      "      MIR_1_FF:           -      29             38              2\n",
      "       MIR_1_K:         141      61            213            140\n",
      "      MIR_1_KL:           -       1              9              1\n",
      "       MIR_1_R:           -       7             14              2\n",
      "      MIR_1_RB:           -      92            144              -\n",
      "     MIR_1_RBP:         136      17            154            131\n",
      "      MIR_2_FF:         141      77            404            138\n",
      "       MIR_2_K:         137      79            351            128\n",
      "      MIR_2_KL:           -      12             15              -\n",
      "       MIR_2_R:         141      78            344            138\n",
      "      MIR_2_RB:           -      11              5              -\n",
      "     MIR_2_RBP:           1      15             14              1\n",
      "      MIR_3_FF:           -      69            146              -\n",
      "       MIR_3_K:           -      24             64              -\n",
      "      MIR_3_KL:           -       6             21              -\n",
      "       MIR_3_R:           -      66            155              -\n",
      "      MIR_3_RB:           -      14             42              -\n",
      "      MIR_4_FF:           -       1              6              -\n",
      "       MIR_4_K:           -       1              9              -\n",
      "      MIR_4_KL:           -       1              -              -\n",
      "       MIR_4_R:           -       1              7              -\n",
      "      MIR_4_RB:           -       1              -              -\n",
      "     MIR_4_RBP:           -       -              3              -\n",
      "      MIR_5_FF:           -       -              1              -\n",
      "       MIR_5_R:           -       -              1              -\n",
      "      MIR_5_RB:           -       -              1              -\n",
      "      MIR_6_KL:           -       -              1              -\n",
      "     MIR_6_RBP:           -       -              1              -\n",
      "  ZERO_HALF_FF:           -       -              1              -\n",
      "   ZERO_HALF_R:           -       -              1              -\n",
      "  ZERO_HALF_RB:           -       1              2              -\n",
      "\n",
      "LNS stats           Improv/Calls  Closed  Difficulty  TimeLimit\n",
      "  'graph_arc_lns':          2/63     46%        0.12       0.10\n",
      "  'graph_cst_lns':          1/61     43%        0.10       0.10\n",
      "  'graph_dec_lns':          7/63     48%        0.15       0.10\n",
      "  'graph_var_lns':          1/63     41%        0.07       0.10\n",
      "      'rins/rens':          0/57     44%        0.04       0.10\n",
      "    'rnd_cst_lns':          1/63     43%        0.07       0.10\n",
      "    'rnd_var_lns':          1/63     48%        0.22       0.10\n",
      "\n",
      "LS stats               Batches  Restarts  LinMoves  GenMoves  CompoundMoves  WeightUpdates\n",
      "  'fj_short_default':        1         1         0         0              0              0\n",
      "      'violation_ls':       63         0   535'143    14'575            659         24'894\n",
      "\n",
      "Solutions (17)         Num     Rank\n",
      "        'default_lp':    1  [17,17]\n",
      "  'fj_short_default':    1    [1,1]\n",
      "     'graph_arc_lns':    2   [5,12]\n",
      "     'graph_cst_lns':    1    [6,6]\n",
      "     'graph_dec_lns':    7   [7,16]\n",
      "     'graph_var_lns':    1    [4,4]\n",
      "       'rnd_cst_lns':    1    [9,9]\n",
      "       'rnd_var_lns':    1    [3,3]\n",
      "      'violation_ls':    2   [2,11]\n",
      "\n",
      "Objective bounds     Num\n",
      "  'initial_domain':    1\n",
      "          'max_lp':    3\n",
      "\n",
      "Solution repositories    Added  Queried  Ignored  Synchro\n",
      "  'feasible solutions':    205      994        0      204\n",
      "        'lp solutions':    714       28        0      533\n",
      "                'pump':    621       36\n",
      "\n",
      "Improving bounds shared    Num\n",
      "         'quick_restart':  141\n",
      "\n",
      "CpSolverResponse summary:\n",
      "status: FEASIBLE\n",
      "objective: 2200\n",
      "best_bound: 2260\n",
      "integers: 25179\n",
      "booleans: 23975\n",
      "conflicts: 262\n",
      "branches: 219660\n",
      "propagations: 4639104\n",
      "integer_propagations: 9740569\n",
      "restarts: 190849\n",
      "lp_iterations: 259383\n",
      "walltime: 60.0805\n",
      "usertime: 60.0805\n",
      "deterministic_time: 278.738\n",
      "gap_integral: 1053.93\n",
      "solution_fingerprint: 0x1a4d0659309acff4\n",
      "\n"
     ]
    }
   ],
   "source": [
    "model, x_fill = create_model(k, items, f3)\n",
    "solver = cp_model.CpSolver()\n",
    "solver.parameters.max_time_in_seconds = 60\n",
    "solver.parameters.log_search_progress = True\n",
    "solver.parameters.relative_gap_limit = 0.01\n",
    "status = solver.solve(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "mo312",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
